<?php

namespace app\common\traits;

/**
 * Trait ToolTrait
 * @package app\common\traits
 */
trait ToolTrait
{


	protected $key = "FDSQ";


	// +--------------------------------------
	// | 数组分页函数 核心函数 array_slice
	// | 用此函数之前要先将数据库里面的所有数据按一定的顺序查询出来存入数组中
	// | @param [$list 分页数据 , $pageSize  每页多少条数据, $currPage   当前第几页 ,$sort  排序规则；例：array('time'=>'desc') ,  $group 分组]
	// | @MethodAuthor: HaiQing
	// | @Date: 2022-07-04 16:51:35
	// +--------------------------------------
	protected function array_page($list, $currPage, $pageSize = 10, $sort = null, $group = null)
	{
		global $pageSizepage; #定全局变量
		$page = (empty($currPage)) ? 1 : $currPage; #判断当前页面是否为空 如果为空就表示为第一页面
		$start = ($page - 1) * $pageSize; #计算每次分页的开始位置
		//排序
		if (!empty($sort)) {
			$GLOBALS['sort'] = &$sort; #申明超全局变量
			unset($sort);
			uasort($list, function ($a, $b) {
				global $sort;
				foreach ($sort as $key => $val) {
					if ($a[$key] == $b[$key]) continue;
					return (($val == 'desc') ? -1 : 1) * (($a[$key] < $b[$key]) ? -1 : 1);
				}
			});
		}
		$totals = count($list);
		//分组
		if (!empty($group)) {
			$tem = array();
			foreach ($list as $val) {
				$tem[$val[$group]][] = $val;
			}
			unset($list);
			$list = $tem;
		}
		$pageSizepage = ceil($totals / $pageSize); #计算总页面数
		$page_data = array();
		$page_data = array_slice($list, $start, $pageSize, $group ? true : false);
		unset($GLOBALS['sort']);
		return $page_data;
	}

	/**
	 * 创建订单号
	 */
	protected function createUniqueNo()
	{

		#yCode 可以按照自己的实际情况调整
		$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'I', 'K', 'L', 'Q', 'W', 'R', 'Y', 'U');
		$order_sn = $this->key . $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
		return $order_sn;
	}

	/**
	 * curl 请求方法
	 * @param $url                   请求地址
	 * @param string $type 请求类型
	 * @param string $dataType 数据类型
	 * @param string $arr 请求数据
	 * @param false $header header
	 * @param int $timeout 超时时间
	 * @param int $connecttimeout
	 * @return mixed|string
	 */
	protected function http_curl($url, $type = "get", $dataType = "json", $arr = "", $header = false, $timeout = 120, $connecttimeout = 0)
	{
		//===1.初始化curl
		$ch = curl_init();
		//===2.设置curl的参数
		curl_setopt($ch, CURLOPT_URL, $url); //发送的路径
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的（Raw）输出
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //禁用后cURL将终止从服务端进行验证
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //禁用后cURL将终止从服务端进行验证
		//curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
		//curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie"));
		if (strtolower($type) == "post") { //post传输数据
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
		}
		if ($header === false) {
			curl_setopt($ch, CURLOPT_HTTPHEADER, []); //启用时会将头文件的信息作为数据流输出
		} else {
			curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //启用时会将头文件的信息作为数据流输出
		}
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); //让cURL自己判断使用哪个版本
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connecttimeout); //在发起连接前等待的时间，如果设置为0，则无限等待
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
		//===3.采集
		$output = curl_exec($ch); //发送请求并获取返回值
		//===4.关闭并返回数据
		if (strtolower($dataType) == 'json') {
			if (curl_errno($ch)) {
				return curl_error($ch);
			}
			$output = json_decode($output, true);
		}
		curl_close($ch);
		return $output;
	}

	/**
	 * 随机生成手机号码
	 */
	protected function &randomMobile($n)
	{
		$tel_arr = array(
			'130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '144', '147', '150', '151', '152', '153', '155', '156', '157', '158', '159', '176', '177', '178', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189',
		);
		for ($i = 0; $i < $n; $i++) {
			// $tmp[] = $tel_arr[array_rand($tel_arr)] . mt_rand(1000, 9999) . mt_rand(1000, 9999);
			$tmp[] = $tel_arr[array_rand($tel_arr)] . 'xxxx' . mt_rand(1000, 9999);
		}
		// return array_unique($tmp);
		return  $tmp;
	}

	/**
	 * 创建目录（可多级）
	 * @param string $dirc
	 * @return bool
	 */
	protected function creDirectory($dirc)
	{
		$check = false;
		try {
			if (is_dir($dirc)) {
				$check = true;
			} else {
				if (mkdir($dirc, 0777, true)) {
					$check = true;
				}
			}
		} finally {
			return $check;
		}
	}

	/** 
	 * 日志记录
	 */
	protected function logs($dir, $filename, $data = [], $Separator = ",")
	{
		if (!$dir || !$filename || !is_array($data)) return false;
		if (!is_dir($dir)) $this->creDirectory($dir);
		$content = implode($Separator, $data);
		$result = file_put_contents($dir . '/' . $filename, (date('Y-m-d h:i:s', time())) . ' ' . $content . "\r\n", FILE_APPEND | LOCK_EX);
		return $result;
	}

	/**
	 * 生成工作日
	 * @param array $holiday 法定节假日
	 * @param array $exchange_day 调休日
	 * @return array  $calendar
	 * 		day：日期 ，2023-01-01
	 * 		day_type：类型 ，0-工作日，1-法定节假日，2-周末加班调休，3-周末
	 * 		is_work_day：是否为工作日，1-是，0-否
	 */
	protected function makeWorkDay($holiday, $exchange_day)
	{
		$calendar = [];
		$year = 0;

		//法定节假日
		foreach ($holiday as $k => $v) {
			$day = date('Y-m-d', strtotime($v));
			$calendar[$day] = [
				'day' => $day,
				'day_type' => 1,
				'is_work_day' => 0
			];

			if (!$year) {
				$year = date('Y', strtotime($day));
			}
		}

		//调休日
		foreach ($exchange_day as $k => $v) {
			$day = date('Y-m-d', strtotime($v));
			$calendar[$day] = [
				'day' => $day,
				'day_type' => 2,
				'is_work_day' => 1
			];
		}

		//其他日期
		$this_date = $year . '-01-01';
		$end_date = ($year + 1) . '-01-01';
		while (strtotime($this_date) < strtotime($end_date)) {
			if (!isset($calendar[$this_date])) {
				$w = date('w', strtotime($this_date));
				if (in_array($w, [0, 6])) {
					$calendar[$this_date] = [
						'day' => $this_date,
						'day_type' => 3,
						'is_work_day' => 0
					];
				} else {
					$calendar[$this_date] = [
						'day' => $this_date,
						'day_type' => 0,
						'is_work_day' => 1
					];
				}
			}
			$this_date = date('Y-m-d', strtotime($this_date . ' +1 day'));
		}

		ksort($calendar);

		return $calendar;
	}

	/**
	 * 检测元素是否正确
	 * 只能检测一维数组
	 * @param $arr 被检测的数组
	 * @param $repar $arr中必要的元素(键名)
	 * @return boolean
	 */
	protected function checkParams($arr, $repar = array())
	{
		if (!is_array($arr)) {
			return false;
		}
		if (!count($arr)) {
			return false;
		}
		// 判断每个元素是否存在
		if (count($repar)) {
			foreach ($repar as $val) {
				if (!in_array($val, array_keys($arr))) {
					return false;
					break;
				}
			}
		}
		// 判断每个元素的值是否正确
		foreach ($arr as $key => $val) {
			if (in_array($key, $repar)) {
				if ($val == "" || $val == false || $val == null || $val == "undefined" || $val == "null" || $val === 0) {
					return false;
					break;
				}
			}
		}
		return true;
	}
}
